package doning;

import com.study.common.TreeNode;
import org.junit.Test;

import static com.study.util.LogUtil.info;
import static java.lang.Math.max;

/**
 * 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
 * <p>
 * 给定一个非空二叉树，返回其最大路径和。
 * 本题中，路径被定义为一条从树中任意节点出发，达到任意节点的序列。该路径至少包含一个节点，且不一定经过根节点。
 * <p>
 * 示例 1:
 * 输入: [1,2,3]
 * <p>
 * 1
 * / \
 * 2   3
 * <p>
 * 输出: 6
 * 示例 2:
 * <p>
 * 输入: [-10,9,20,null,null,15,7]
 * <p>
 * -10
 * / \
 * 9  20
 * /  \
 * 15   7
 * <p>
 * 输出: 42
 * <p>
 * 2019-05-17 22:13
 **/
@SuppressWarnings("all")
public class BinaryTreeMaximumPathSum {

    private int ret = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        //first 190517
        dfs(root);
        return ret;
    }

    private int dfs(TreeNode root) {
        if (root == null)
            return 0;

        int left = dfs(root.left);

        int right = dfs(root.right);

        ret = max(ret, left + right + root.val);

        return max(left, right) + root.val;
    }

    @Test
    public void test() {
        info(maxPathSum(new TreeNode(-10,
                9, new TreeNode(20,
                15, 7))));
    }
}


































/*
private int ret = Integer.MIN_VALUE;

public int maxPathSum(TreeNode root) {
    // 对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况:
    // 1. 其左右子树中所构成的和路径值较大的那个加上该节点的值后向父节点回溯构成最大路径
    // 2. 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径
    getMax(root);
    return ret;
}

private int getMax(TreeNode r) {
    if (r == null)
        return 0;

    // 如果子树路径和为负则应当置0表示最大路径不包含子树
    int left = Math.max(0, getMax(r.left));

    int right = Math.max(0, getMax(r.right));

    // 判断在该节点包含左右子树的路径和是否大于当前最大路径和
    ret = Math.max(ret, r.val + left + right);

    return Math.max(left, right) + r.val;
}
*/
